/****************************************************************************
 * dig_encode 单信道编码
 * Tested MCU
 * Owner : aple
 * **************************************************************************/
#ifndef __dig_ENCODE_H_H_
#define __dig_ENCODE_H_H_

#include "stdint.h"

#ifdef __cplusplus
extern "C"
{
#endif

	/*--------------------------------------------------------------------*
	 * 半双工单线通信,异步编码
	 * 高位在前
	 * 为简化编码，最高位数据必须为0
	 * IO必须为开漏或弱上拉输出
	 * 发送间隔至少上次数据尾部32个时钟
	 * 接收间隔至少16时钟，发送结束后可立即接收
	 *---------------------------------------------------------------------*/
	typedef struct
	{
		uint8_t sample_time_cnt;
		uint8_t idle_time_cnt;

		int8_t in_flt;
		int8_t in_st;

		uint8_t bit_cnt;
		uint8_t bit_sv;
		uint8_t b_rx_ne;

		uint8_t snd_st;
		uint8_t rcv_st;

		uint8_t rcv_allow;
		uint8_t tx_allow;

		uint32_t rx_shift;
		uint32_t rx;
		uint32_t tx;

		void (*tx_out)(uint8_t st);
		uint8_t (*rx_in)(void);
		void (*io_dir)(uint8_t dir); // 0r1w
	} dig_encode_type;

	void dig_encode_handle(dig_encode_type *obj);
	uint32_t dig_encode_read(dig_encode_type *obj);
	void dig_encode_write(dig_encode_type *obj, uint32_t dat);

	/*******************************************************************************
	 * @brief  同步通信结构
	 *******************************************************************************/
	typedef struct
	{
		uint8_t act_time_cnt;
		uint8_t idle_time_cnt;

		int8_t in_st;

		// 位计数
		uint8_t bit_cnt;
		uint8_t bit_sv; // 【Y】位宽设定

		// 收发状态
		uint8_t snd_st;
		uint8_t rcv_st;
		uint8_t rcv_err; // 【X】内部设置，外部清除，电平时间超长

		// 判定读写
		uint8_t b_rxne; // 【X】应用层根据该标志判断是否可读
		uint8_t b_txe;	// 【X】应用层根据该标志判断是否可写

		// 收发值
		uint32_t rx_shift;
		uint32_t rx;
		uint32_t tx;

		void (*tx_out)(uint8_t st);
		uint8_t (*rx_in)(void);
		void (*io_dir)(uint8_t dir); // 0r1w
	} sig_encode_type;

	void sig_encode_handle(sig_encode_type *obj);			   // 中断中调用
	uint32_t sig_encode_read(sig_encode_type *obj);			   // 查询 b_rxne 后读数据
	void sig_encode_write(sig_encode_type *obj, uint32_t dat); // 查询 b_txe后写数据

/*******************************************************************************
 * @brief  模拟 UART 发送结构: 帧格式固定为8N1
 *******************************************************************************/
#define SIM_UART_BUFF_LEN 8
	typedef struct
	{
		// 收发值，及状态
		uint16_t tx;

		// 发送时缓冲已满
		uint8_t over_load;

		// 发送缓存
		uint8_t tx_next; // 当前缓存深度，为0表示空，为SIM_UART_BUFF_LEN表示满
		uint8_t tx_buff[SIM_UART_BUFF_LEN];

		void (*tx_out)(uint8_t st);
	} sim_uart_out_type;

	//  @brief   发送位处理，每调用一次发送一位数据
	void sim_uart_bit_manage(sim_uart_out_type *obj);
	// @brief   发送数据：如果发送和位管理接口不在同一线程，调用该函数需要临界保护
	void sim_uart_send(sim_uart_out_type *obj, uint8_t dat);

#ifdef __cplusplus
}
#endif

#endif /* __dig_ENCODE_H_H_ */
